# Deterministicki potisni automat
# mode 0 praznim stogom
# mode 1 prihvatljivim stanjem
class automat:


    def __init__(self):
        self.stanja=[]
        self.ulazni_znakovi=[]
        self.znakovi_stoga=[]
        self.pocetno_stanje=""
        self.dno_stoga=""
        self.prihvatljiva_stanja=[]
        self.prijelazi={}




    def citaj(self):
        datoteka=open("automat.txt","r")

        temp=datoteka.readline()
        temp=temp.split(',')
        temp[len(temp)-1]=temp[len(temp)-1][:len(temp[len(temp)-1])-1]
        self.stanja=temp[:]


        temp=datoteka.readline()
        temp=temp.split(',')
        temp[len(temp)-1]=temp[len(temp)-1][:len(temp[len(temp)-1])-1]
        self.ulazni_znakovi=temp[:]

        temp=datoteka.readline()
        temp=temp.split(',')
        temp[len(temp)-1]=temp[len(temp)-1][:len(temp[len(temp)-1])-1]
        self.znakovi_stoga=temp[:]

        temp=datoteka.readline()
        self.pocetno_stanje=temp[:len(temp)-1]

        temp=datoteka.readline()
        self.dno_stoga=temp[:len(temp)-1]

        temp=datoteka.readline()
        temp=temp.split(',')
        temp[len(temp)-1]=temp[len(temp)-1][:len(temp[len(temp)-1])-1]
        self.prihvatljiva_stanja=temp[:]

        for line in datoteka:
            temp=line.split("->")
            desna=temp[1].split(',')
            desna[len(desna)-1]=desna[len(desna)-1][:len(desna[len(desna)-1])-1]
            self.prijelazi[temp[0]]=desna



    def analiziraj_niz(self,niz,mode):
        stanje=self.pocetno_stanje
        stog=[self.dno_stoga]
        for i in range(0,len(niz)):
            if len(stog)>0:
                znak_stoga=stog.pop()
                lijevo=stanje + "," + niz[i] + "," + znak_stoga
            else:
                lijevo=""


            if lijevo in self.prijelazi.keys():
                stanje=self.prijelazi[lijevo][0]
                stog_r= self.prijelazi[lijevo][1][::-1]
                if stog_r != "$":
                    for j in stog_r:
                        stog.append(j)
            else:
                lijevo=stanje + "," + "$" + "," + znak_stoga
                i=i-1
                if lijevo in self.prijelazi.keys():
                    stanje=self.prijelazi[lijevo][0]
                    stog_r= self.prijelazi[lijevo][1][::-1]
                    if stog_r != "$":
                        for j in stog_r:
                            stog.append(j)
                else:
                    stanje=""
                    return 0

        if i != len(niz)-1:
            return 0
        if len(stog)>0:
            znak_stoga=stog.pop()
            lijevo=stanje + "," + "$" + "," + znak_stoga
        else:
            lijevo=""

        while lijevo in self.prijelazi.keys():

            stanje=self.prijelazi[lijevo][0]
            stog_r= self.prijelazi[lijevo][1][::-1]
            if stog_r != "$":
                for j in stog_r:
                    stog.append(j)


            if len(stog)>0:
                znak_stoga=stog.pop()
                lijevo=stanje + "," + "$" + "," + znak_stoga
            else:
                lijevo=""

        if mode == 1:
            if stanje in self.prihvatljiva_stanja:
                return 1
            else:
                return 0

        if mode == 0:
            if len(stog) == 0:
                return 1
            else:
                return 0

def main():
    a=automat()
    a.citaj()
    print(a.prijelazi)
    print(a.analiziraj_niz("01210",1))


if __name__ == '__main__':
    main()
